"""
对数变换处理器 - 对数据进行对数变换

这个处理器会对数值列进行对数变换：log(x + 1)
适用于处理偏态分布的数据
"""

import pandas as pd
import numpy as np
from ..base import PreprocessorInterface
from ..validation import validate_input_data, safe_copy_dataframe


class LogTransform(PreprocessorInterface):
    """
    对数变换处理器
    
    对数值数据进行对数变换，有助于处理偏态分布
    公式：log(x + 1)  # 加1避免log(0)的问题
    """
    
    def process(self, data: pd.DataFrame) -> pd.DataFrame:
        """
        对数据进行对数变换
        
        Args:
            data (pd.DataFrame): 输入数据
            
        Returns:
            pd.DataFrame: 对数变换后的数据
        """
        # 验证输入数据
        validate_input_data(data)
        
        # 创建数据副本
        result = safe_copy_dataframe(data)
        
        # 获取数值列（跳过第一列ID列）
        numeric_columns = result.columns[1:]
        
        # 对每个数值列进行对数变换
        for col in numeric_columns:
            if pd.api.types.is_numeric_dtype(result[col]):
                # 确保所有值都是非负的（对数变换要求）
                min_val = result[col].min()
                if min_val < 0:
                    # 如果有负值，先平移到非负范围
                    result[col] = result[col] - min_val
                
                # 进行对数变换，加1避免log(0)
                result[col] = np.log1p(result[col])  # log1p(x) = log(1+x)
        
        return result
    
    def get_name(self) -> str:
        """返回处理器名称"""
        return "对数变换"
    
    def get_id(self) -> int:
        """返回唯一ID"""
        return 3  # 每个处理器必须有唯一的ID